# 定义变量
PROTO_DIR := .
GO_OUT_DIR := .
PROTOC := protoc
SERVICES := auth user

# 定义颜色
BLUE := \033[1;34m
GREEN := \033[1;32m
YELLOW := \033[1;33m
NC := \033[0m

# 默认目标
.DEFAULT_GOAL := help

.PHONY: all $(SERVICES) clean help

# 帮助目标
help:
	@echo "可用的目标:"
	@echo "  help                                       - 显示此帮助信息"
	@echo "  clean                                      - 删除所有生成的Protobuf文件"
	@echo "  all                                        - 为所有服务生成所有版本的Protobuf文件"
	@echo "  <service>                                  - 为指定服务生成所有版本的Protobuf文件"
	@echo "  <service> PROTO_FILE=<proto_file>          - 为指定服务生成指定版本的Protobuf文件"
	@echo "示例:"
	@echo "  make auth                                  - 为 auth 服务生成所有版本的Protobuf文件"
	@echo "  make user                                  - 为 user 服务生成所有版本的Protobuf文件"
	@echo "  make auth PROTO_FILE=auth/auth_v1.proto    - 只生成 auth_v1.proto 的Protobuf文件"
	@echo "  make all                                   - 为所有服务生成所有版本的Protobuf文件"
	@echo "  make clean                                 - 删除所有生成的Protobuf文件"

# 为每个服务生成Protobuf文件
$(SERVICES):
	@if [ -z "$(PROTO_FILE)" ]; then \
		echo "$(BLUE)正在为 $@ 服务生成所有版本的Protobuf文件...$(NC)"; \
		for proto in $(PROTO_DIR)/$@/*.proto; do \
			$(MAKE) -s $@ PROTO_FILE=$$proto; \
		done; \
	else \
		echo "$(GREEN)正在生成 $(YELLOW)$(PROTO_FILE)$(GREEN) 的Protobuf文件...$(NC)"; \
		filename=$$(basename $(PROTO_FILE) .proto); \
		version=$$(echo $$filename | sed 's/.*_v//'); \
		mkdir -p $(GO_OUT_DIR)/$@/v$$version; \
		rm -f $(GO_OUT_DIR)/$@/v$$version/*.go; \
		$(PROTOC) --proto_path=$(PROTO_DIR)/$@ \
			--go_out=$(GO_OUT_DIR)/$@/v$$version --go_opt=paths=source_relative \
			--go-grpc_out=$(GO_OUT_DIR)/$@/v$$version --go-grpc_opt=paths=source_relative \
			$(PROTO_FILE); \
		echo "$(GREEN)✓ 已生成 $(YELLOW)$(PROTO_FILE)$(GREEN) 的Protobuf文件$(NC)"; \
	fi

# 生成所有服务的所有版本的Protobuf文件
all: $(SERVICES)
	@echo "$(BLUE)------------------------------------------------$(NC)"
	@echo "$(GREEN)✓ 所有Protobuf文件生成完成$(NC)"

# 清理生成的文件
clean:
	@echo "$(YELLOW)正在清理所有生成的Protobuf文件...$(NC)"
	@for service in $(SERVICES); do \
		rm -rf $$service/v*; \
	done
	@echo "$(GREEN)✓ 清理完成$(NC)"

